
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.Border;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Oscar
 */
public class GrafoGUI extends javax.swing.JPanel {

    //Grafo que este panel se encuentra graficando.
    private ControlRobot control;
    private Grafo elGrafo;
    private JPanel cuadricula;
    private ArrayList<BotonNodo> botonesNodos;
    private ArrayList<Integer> rutasHorizontales;
    private ArrayList<Integer> rutasVerticales;
    
    /**
     * Creates new form GrafoGUI
     */
    public GrafoGUI(ControlRobot elControl) {
        try {
            control = elControl;
            elGrafo = control.getGrafo();
            int ancho = elGrafo.getSide();        
            //initComponents();
            ArrayList<Coordenada> nodos = elGrafo.getNodos();
            ArrayList<Integer> cuadroNodos = new ArrayList(nodos.size());
            for (int i=0; i < nodos.size(); i++){
                cuadroNodos.add(i, new Integer(nodos.get(i).hashCode()));
            }
            
            generateRutas();
            //Hacer el floyd desde la pantalla de exploración.
            elGrafo.floyd();
            
            botonesNodos = new ArrayList();
            cuadricula = new JPanel();
            cuadricula.setLayout(new GridLayout(ancho, ancho));
            
            BufferedImage rutaVerticalBImg = ImageIO.read(new File("AristaVerticalRoad.jpg"));
            ImageIcon rutaVerticalImg = new ImageIcon(rutaVerticalBImg);
            BufferedImage rutaHorizontalBImg = ImageIO.read(new File("AristaHorizontalRoad.jpg"));
            ImageIcon rutaHorizontalImg = new ImageIcon(rutaHorizontalBImg);
            BufferedImage obstaculoBImg = ImageIO.read(new File("obstacleRoad.jpg"));
            ImageIcon obstaculoImg = new ImageIcon(obstaculoBImg);
            
            for(int cuadro=0; cuadro < ancho*ancho; cuadro++){
                Integer numCuadro = new Integer(cuadro);
                if (cuadroNodos.contains(numCuadro)){
                    Integer numNodo = new Integer (cuadroNodos.indexOf(numCuadro));
                    BotonNodo botonNodo = new BotonNodo(numNodo.toString(),Coordenada.dehash(cuadro));
                    Border dentro = BorderFactory.createRaisedBevelBorder();
                    Border fuera = BorderFactory.createLineBorder(new Color(76, 153, 71), 5);
                    Border borde = BorderFactory.createCompoundBorder(fuera, dentro);
                    botonNodo.setBorder(borde);
                    botonNodo.setBackground(new Color(118, 106, 56));
                    botonNodo.setSize(new Dimension(50,50));
                    //botonNodo.setBackground(Color.white);
                    NodoListener escuchaNodo = new NodoListener();
                    botonNodo.addActionListener(escuchaNodo);
                    cuadricula.add(botonNodo);
                    botonesNodos.add(botonNodo);
                }else{
                    if(rutasHorizontales.contains(numCuadro)){
                        JLabel horizontalAristaLabel = new JLabel(rutaHorizontalImg);
                        horizontalAristaLabel.setPreferredSize(new Dimension(50,50));
                        cuadricula.add(horizontalAristaLabel);
                    }else{
                        if(rutasVerticales.contains(numCuadro)){
                                //BufferedImage rutaVerticalImg = ImageIO.read(new File("AristaVertical.jpg"));
                                JLabel verticalAristaLabel = new JLabel(rutaVerticalImg);
                                verticalAristaLabel.setPreferredSize(new Dimension(50,50));
                                cuadricula.add(verticalAristaLabel);
                        }else{
                                JLabel obstaculoLabel = new JLabel(obstaculoImg);
                                obstaculoLabel.setPreferredSize(new Dimension(50,50));
                                cuadricula.add(obstaculoLabel);
                        }
                    }                
                }
            }
            add(cuadricula);
        } catch (IOException ex) {
            Logger.getLogger(GrafoGUI.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private void generateRutas(){
        rutasHorizontales = new ArrayList();
        rutasVerticales = new ArrayList();
        ArrayList<Arista> aristas = elGrafo.getAristas();
        for (Arista arista : aristas){
            Coordenada[] coordenadas = arista.getVertices();
            Coordenada primeraCoord =coordenadas[0];
            Coordenada segundaCoord =coordenadas[1];
            if (arista.esHorizontal()){
                int fila = primeraCoord.getFila();
                int primerCol = primeraCoord.getCol();
                int segundaCol = segundaCoord.getCol();
                if (segundaCol < primerCol){
                    int tempCol = segundaCol;
                    segundaCol = primerCol;
                    primerCol = tempCol;
                }
                for (int i=primerCol + 1; i < segundaCol; i++){
                    Coordenada rutaHorizontal = new Coordenada(fila, i);
                    rutasHorizontales.add(new Integer(rutaHorizontal.hashCode()));
                }
            }else{
                int col = primeraCoord.getCol();
                int primerFila = primeraCoord.getFila();
                int segundaFila = segundaCoord.getFila();
                if (segundaFila < primerFila){
                    int tempFila = segundaFila;
                    segundaFila = primerFila;
                    primerFila = tempFila;
                }
                for (int i=primerFila + 1; i < segundaFila; i++){
                    Coordenada rutaVertical = new Coordenada(i, col);
                    rutasVerticales.add(new Integer(rutaVertical.hashCode()));
                }
            }
        }
    }
    
    private class NodoListener implements ActionListener{

        @Override
        public void actionPerformed(ActionEvent e) {
            for(BotonNodo nodo : botonesNodos){
                nodo.setEnabled(false);
            }
            control.dirigirseA(((BotonNodo)e.getSource()).getCoordenada());
            for(BotonNodo nodo : botonesNodos){
                nodo.setEnabled(true);
            }
        }
        
    }
    
    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 400, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 300, Short.MAX_VALUE)
        );
    }// </editor-fold>//GEN-END:initComponents
    // Variables declaration - do not modify//GEN-BEGIN:variables
    // End of variables declaration//GEN-END:variables
}
